Zookeeper zkCli 命令
基础命令使用
启动服务
# 启动:
zkServer.sh start
# 停止:
zkServer.sh stop
# 查看状态:
zkServer.sh status
然后通过下面这个命令进入终端
./zkCli.sh
退出终端用 quit
命令一览
注意:早期版本的 zk 是输入命令后会自动打印状态,新版得加个 -s
参数才行
下面是命令一览
[zkshell: 0] help
ZooKeeper -server host:port cmd args
addauth scheme auth
close
config [-c] [-w] [-s]
connect host:port
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
delete [-v version] path
deleteall path
delquota [-n|-b] path
get [-s] [-w] path
getAcl [-s] path
getAllChildrenNumber path
getEphemerals path
history
listquota path
ls [-s] [-w] [-R] path
printwatches on|off
quit # 退出终端
reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]
redo cmdno
removewatches path [-c|-d|-a] [-l]
rmr path
set [-s] [-v version] path data
setAcl [-s] [-v version] [-R] path acl
setquota -n|-b val path
stat [-w] path
sync path
From here, you
查看 zk 状态
使用下面这个命令可以查看当前 zk 的状态
echo stat|nc 127.0.0.1 2181
如下显示为 Leader
方式二:
./zkServer.sh status
可以看到 zk 的配置文件的位置
create 命令创建节点
create 命令用于创建节点并赋值
create [-s] [-e] path data acl
参数:
[-s] [-e]:-s 和 -e 都是可选的,-s 代表顺序节点, -e 代表临时节点,注意其中 -s 和 -e 可以同时使用的,并且临时节点不能再创建子节点。
path:指定要创建节点的路径,比如 `/test`
data:要在此节点存储的数据。
path:访问权限相关,默认是 world,相当于全世界都能访问。
创建子节点
create /hadoop/temp "these are the data"
创建持久节点
如下创建一个 /hadoop
节点(默认创建的节点是持久节点),保存的数据是 123456
create /hadoop "123456"
创建一个顺序节点(顺序节点可以是持久的或临时的)
如下,创建的节点名称一样都是 /a
但是 zk 会自动在后面加上 0000000001
取数据也是通过 get /a0000000001
创建临时节点
create -e /temp "123456"
他会在客户端与 ZooKeeper 集合断开连接时被删除(即 quit
)
set 修改节点
set 命令用于修改节点存储的数据。
set path data [version]
参数:
path:节点路径。
data:需要存储的数据。
[version]:可选项,版本号(可用作乐观锁)。
使用例:
ls 查看目录
在老版本有 ls2
这个命令,新版本这个命令变成了下面这个
ls -s path
代替了
递归查看
ls -R path
get 命令取得数据
get 命令用于获取节点数据和状态信息。
get path [watch]
path
:代表路径。[watch]
:对节点进行事件监听。
delete 删除节点
语法:
delete path # 节点下面有子节点的话就无法删除
delete -v [版本号] path # 节点下面有子节点的话就无法删除
rmr path # 连同节点下的子节点一并删除
# 新版换成了 deleteall 命令
deleteall path # 删除全部
stat 查看节点状态
检查状态 stat
Zookeeper 的每个 ZNode 上都会存储数据,对应到每个 ZNode,Zookeeper 都会为其维护一个叫做 Stat 的数据结构,Stat 中记录的内容如下:
cZxid: 节点创建时的zxid
ctime: 节点创建时间
mZxid: 最后一次更新的zxid
mtime: 最后一次更新的时间
pZxid: 子节点的最后版本
cversion: 子节点数据更新次数
dataVersion: 节点数据更新次数
aclVersion: acl的变更次数
ephemeralOwner: 如果znode是临时节点,则值为所有者的sessionId;如果不是临时节点,则为零
dataLength: 节点的数据长度
numChildren: 子节点个数
监听器 watch
get path -w
使用 get path watch 注册的监听器能够在 节点内容 发生改变的时候,向客户端发出通知。需要注意的是 zookeeper 的触发器是一次性的(One-time trigger),即触发一次后就会立即失效。
# 旧版的写法
get path watch
# 新版的写法
get path -w
终端一
终端二
终端二修改后,回到终端一可以看到发送了事件
stat path watch
使用 stat path watch 注册的监听器能够在 节点状态 发生改变的时候,向客户端发出通知。
# 旧版的写法
stat path watch
# 新版的写法
stat path -w
ls path watch
使用 ls path watch 注册的监听器能够监听该节点下所有 子节点的增加和删除操作。
# 旧版的写法
ls path watch
# 新版的写法
ls path -w
Acl权限控制
zookeeper 的 access control list 访问控制列表可以使用:scheme:id:permission
来标识,主要涵盖三个方面:
- 权限模式(scheme):授权的策略
- 授权对象(id):授权的对象
- 权限(permission):授予的权限
其特性如下:
- zookeeper 的权限控制是基于每个 znode 节点的,需要对每个节点设置权限。
- 每个 znode 支持设置多种权限控制发难和多个权限。
- 字节点不会继承父节点的权限,客户端无权访问某个节点,但可能可以访问它的子节点。
授权的模式
采用何种方式授权
方案 | 描述 |
---|---|
world | 只有一个用户:anyone,代表登录 zookeeper 所有人(默认) |
ip | 对客户端使用IP地址认证 |
auth | 使用已添加认证的用户认证 |
digest | 使用“用户名:密码”方式认证 |
授予的权限
权限 | ACL简写 | 描述 |
---|---|---|
create | c | 可以创建子节点 |
delete | d | 可以删除子节点(仅下一级节点) |
read | r | 可以读取节点数据及显示子节点列表 |
write | w | 可以设置节点数据 |
admin | a | 可以设置节点访问控制列表权限 |
ACL 关于授权的命令
命令 | 使用方式 | 描述 |
---|---|---|
getAcl | getAcl path | 读取ACL权限 |
setAcl | setAcl path acl | 设置ACL权限 |
addauth | addauth scheme auth | 添加认证用户(密码是以加密的形式存在) |
#连接zk
zkCli.sh -server 127.0.0.1:2181
create /test 123
create /test/abc aaa
# 查看默认权限
getAcl /test/abc
'world,'anyone
:cdrwa
world 授权模式
语法:
setAcl path <world>:<anyone>:<acl>
示例:
setAcl /java world:anyone:drwa
IP 授权模式
语法:
setAcl path <ip>:<ip地址>:<acl>
示例:
setAcl /java ip:127.0.0.1:cdrwa,ip:127.0.0.2:cdrwa
digest 授权模式(密码)
Digest 是最常用的权限控制模式,也更符合我们对于权限控制的认识,其类似于 username:password
形式的权限标识来进行权限配置,便于区分不同应用来进行权限控制。
当我们通过 username:password
形式配置了权限标识。这里的密码是密文,ZooKeeper 会对其先后进行两次编码处理,分别是 SHA-1 算法加密和 BASE64 编码,在 SHELL 中可以通过以下命令计算:
echo -n<user>:<password> | openssl dgst -binary -sha1 | openssl base64
先来算一个密文密码:
echo -n user-1:password-1 | openssl dgst -binary -sha1 | openssl base64
# 1g4T1B5w+se9ntA6Ckp90uPaJ30=
设置 Digest 模式的语法:
setAcl path <digest>:<username>:<password>:<acl>
示例:
setAcl /test/digest-node-1 digest:user-1:1g4T1B5w+se9ntA6Ckp90uPaJ30=:cdrwa
1g4T1B5w+se9ntA6Ckp90uPaJ30=
为 password-1
对应的密文。
注意的是虽然可以使用明文密码 user-1:password-1
设置 ACL(实际上 ZooKeeper 认为 password-1
是两次编码处理的密文),但是获取内容时会没有权限
示例2:
# digest 需要密文的方式设置权限
setAcl /names/test digest:revin:xxqweqweqweqweq=:cdrwa
# 登录用户
add auth digest revin:revin123
get /names/test
auth 授权模式
Auth 是一种特殊模式,不会对任何授权对象 ID 进行授权,而是对所有已经添加认证的用户进行授权。
添加用户语法:
addauth digest <username>:<password>
实例:
addauth digest admin:admin
持久化 ACL 信息时,ZooKeeper 服务器会忽略 scheme:id:perm
中提供的任何授权对象表达式。但是仍必须在 ACL 中提供表达式,可以是一个空串,或者其他任意字符串,因为 ACL 必须与 scheme:id:permission
格式匹配:
语法:
setAcl path <auth>:<username>:<acl>
示例:
setAcl /test/auth-node auth:cdrwa
使用此模式我们可以给多个授权用户使用不同的用户名和密码访问 ZNode。假设我们有3个用户:
- user-1:password-1
- user-2:password-2
- user-3:password-3
addauth digest user-1:password-1
addauth digest user-2:password-2
addauth digest user-3:password-3
setAcl /names/test auth:user-1:password-1:cdrwa
setAcl /names/test auth:user-2:password-2:cdrwa
setAcl /names/test auth:user-3:password-3:cdrwa
多种模式授权
setAcl /node5 ip:0.0.0.0:cdra,auth:admin:cdrea,digest:admin:x1nq8J5GOJVPY6zgzhtTtA9izLc=:cdrwa
super 超级管理员
Super模式,顾名思义就是超级用户的意思,为管理员所使用,这也是一种特殊的 Digest 模式。在 Super 模式下,超级用户可以对任意 ZooKeeper 上的数据节点进行任何操作,不会被任何节点的 ACL 所限制。
首先需要在 ZooKeeper 服务器上开启 Super 模式,方法是在 ZooKeeper 服务器启动的时候,添加如下系统属性:
-Dzookeeper.DigestAuthenticationProvider.superDigest=super:zUZ0bpqYS7FucDXsnUgxOWTto1s=
其中,super 代表了一个超级管理员的用户名;
zUZ0bpqYS7FucDXsnUgxOWTto1s=
是由 ZooKeeper 的系统管理员自主配置密码的两次编码处理后的密文,此例中使用的是 super:root 的编码。
打开 ZooKeeper 目录下的 /bin/zkServer.sh
服务器脚本,找到如下一行:
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
默认只有以上两个配置项,我们需要把下面的配置项加到服务器脚本中:
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0sxEug2Dpm/NpzMPieOlFREd9Ao=" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
重启服务后,输入下面命令添加权限
addauth digest super:root # 添加认证用户
Reference
Zookeeper 客户端基础命令使用 The number of milliseconds of each tick, 最小时间单位,很多运行时的时间 ACL权限控制命令 ZooKeeper ACL权限控制机制